|
テクニカル Q&AQTMTB 52 - QuickTime 4 でメモリ上の WAVE データを再生する方法 (1999 年 8 月 21 日)
Q: QuickTime 4 でメモリ上にある WAVE データを再生する方法を教えてください。 A: QuickTime 4 には組み込みの WAV ファイルインポータがあります。まるで QuickTime のムービーファイルであるかのように、いとも簡単に WAV ファイルを開いて再生することができます。例えば次に示すのは、読者がそのまま利用できる、QuickTime で WAV ファイルを再生するコードです (ファイルプロンプトで WAV ファイルを選ぶと QuickTime は音だけのムービーとして再生します)。 OSErr PlayWAVfile () { SFTypeList myTypeList; StandardFileReply myReply; OSErr err = noErr; short movieRefNum, resID = 0; Movie movie; StandardGetFilePreview(NULL, -1, myTypeList, &myReply); if (!myReply.sfGood) { err = userCanceledErr; return err; } else { err = OpenMovieFile(&myReply.sfFile, &movieRefNum, fsRdPerm); if (!err) { err = NewMovieFromFile(&movie, movieRefNum, &resID, NULL, newMovieActive, NULL); } if (err) { if (movie) { DisposeMovie(movie); } } else { SetMovieVolume(movie, kFullVolume); GoToBeginningOfMovie(movie); StartMovie(movie); while (!IsMovieDone(movie)) { MoviesTask(movie, 0); err = GetMoviesError(); } } } return err; } WAV データがファイルではなくメモリ上にある場合、WAV サウンドを QuickTime で再生するにはもう少し作業が必要です。このような場合、ひとつの方法は、新しいムービーを作成し、WAV データを別のサウンドトラックとして追加する方法です (QuickTime の WAV インポータはファイルにしか対応しないため)。『Inside Macintosh: QuickTime』第 2 章にはスクラッチレベルから新しいムービーを作成し、それにサウンドトラックを追加するサンプルコードがあります。同じ方法でムービーのサウンドトラックに WAV データを追加し、ムービーを再生することができます。 もうひとつの方法は、QuickTime の WAV ムービーインポートコンポーネントと MovieImportDataRef 関数を使って、メモリ上の WAV ファイルデータをムービーに追加する方法です。MovieImportDataRef 関数にはインポート操作で使用するデータ参照 (data reference) を指定します (この場合は WAV ファイルデータのデータ参照へのハンドル)。dataRef パラメータには、WAV データへのハンドルではなく、先頭のデータハンドルへのハンドルを渡すことに注意してください (以下のコードを参照)。 void ImportWAVDataFromMemory(Ptr waveDataPtr, long waveDataSize) { Handle myHandle, dataRef = nil; Movie movie; MovieImportComponent miComponent; Track targetTrack = nil; TimeValue addedDuration = 0; long outFlags = 0; OSErr err; ComponentResult result; myHandle = NewHandleClear((Size)waveDataSize); BlockMove(waveDataPtr, *myHandle, waveDataSize); err = PtrToHand(&myHandle, &dataRef, sizeof(Handle)); miComponent = OpenDefaultComponent(MovieImportType, kQTFileTypeWave); movie = NewMovie(0); result = MovieImportDataRef(miComponent, dataRef, HandleDataHandlerSubType, movie, nil, &targetTrack, nil, &addedDuration, movieImportCreateTrack, &outFlags); SetMovieVolume(movie, kFullVolume); GoToBeginningOfMovie(movie); StartMovie(movie); while (!IsMovieDone(movie)) { MoviesTask(movie, 0); err = GetMoviesError(); } }
-- Scott Kuechle Worldwide Developer Technical Support テクニカル Q&A | 目次 To contact us, please use the Contact Us page. |